<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1"><!-- Begin Jekyll SEO tag v2.8.0 -->
<title>0095: Hardware II – Full Monitor Report | gtkDcoding</title>
<meta name="generator" content="Jekyll v4.3.4" />
<meta property="og:title" content="0095: Hardware II – Full Monitor Report" />
<meta name="author" content="Ron Tarrant" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="This GTK Tutorial covers collecting monitor data for a running application." />
<meta property="og:description" content="This GTK Tutorial covers collecting monitor data for a running application." />
<link rel="canonical" href="http://localhost:4000/posts/0095-hardware-ii-full-monitor-report.html" />
<meta property="og:url" content="http://localhost:4000/posts/0095-hardware-ii-full-monitor-report.html" />
<meta property="og:site_name" content="gtkDcoding" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2019-12-24T00:00:00-05:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="0095: Hardware II – Full Monitor Report" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"Ron Tarrant"},"dateModified":"2019-12-24T00:00:00-05:00","datePublished":"2019-12-24T00:00:00-05:00","description":"This GTK Tutorial covers collecting monitor data for a running application.","headline":"0095: Hardware II – Full Monitor Report","mainEntityOfPage":{"@type":"WebPage","@id":"http://localhost:4000/posts/0095-hardware-ii-full-monitor-report.html"},"url":"http://localhost:4000/posts/0095-hardware-ii-full-monitor-report.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="../assets/main.css">
  <link rel="stylesheet" href="../css/style.css" /><link type="application/atom+xml" rel="alternate" href="http://localhost:4000/feed.xml" title="gtkDcoding" /></head>
<body><header class="site-header" role="banner">

  <div class="wrapper"><a class="site-title" rel="author" href="../">gtkDcoding</a><nav class="site-nav">
        <input type="checkbox" id="nav-trigger" class="nav-trigger" />
        <label for="nav-trigger">
          <span class="menu-icon">
            <svg viewBox="0 0 18 15" width="18px" height="15px">
              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
            </svg>
          </span>
        </label>

        <div class="trigger"><a class="page-link" href="../about.html">About</a><a class="page-link" href="../index-reverse.html">Posts in Date Order</a><a class="page-link" href="../topics.html">Blog Posts by Topic</a></div>
      </nav></div>
</header>
<main class="page-content" aria-label="Content">
      <div class="wrapper">
        <article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
	<header class="post-header">
		<link rel="stylesheet" href="../css/font_size.css" />
		<link rel="stylesheet" href="../css/figure.css" />
		<link rel="stylesheet" href="../css/topics/hardware.css" />  <!-- sub in the tag/topic -->
		<link rel="stylesheet" href="../css/modal.css" />
		<link rel="stylesheet" href="../css/post.css" />
		<link rel="stylesheet" href="../css/mascot_effects.css" />

		
		
		<p class="post-meta">
		<time class="dt-published" datetime="2019-12-24T00:00:00-05:00" itemprop="datePublished">Tuesday, December 24, 2019
		</time>• by <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span class="p-author h-card" itemprop="name">Ron Tarrant</span></span></p>
	</header>

	<div class="post-content e-content" itemprop="articleBody">
		<div class="skew-line"></div>
		<h1 id="0095-hardware-ii--full-monitor-report">0095: Hardware II – Full Monitor Report</h1>

<p>This time, we’re looking for more than just a monitor head count. We can get the resolution of each monitor in a multi-monitor <code class="language-plaintext highlighter-rouge">Seat</code>, each monitor’s position within the <code class="language-plaintext highlighter-rouge">Screen</code> (or <code class="language-plaintext highlighter-rouge">Seat</code>, if you prefer), the model and, since we’ll have all the information we’ll need at our fingertips, let’s also find out which monitor our <code class="language-plaintext highlighter-rouge">Window</code> is on at any given time. This fulfills a request made by <em>GreatSam4Sure</em> on <a href="https://forum.dlang.org">forum.dlang.org</a>.</p>

<h2 id="window-location--other-stuff">Window Location &amp; Other Stuff</h2>

<!-- 0, 1 -->
<!-- first occurrence of application and terminal screen shots on a single page -->
<div class="screenshot-frame">
	<div class="frame-header">
		Results of this example:
	</div>
	<div class="frame-screenshot">
		<figure>
			<img id="img0" src="../images/screenshots/024_hardware/hardware_02.png" alt="Current example output" />		<!-- img# -->
			
			<!-- Modal for screenshot -->
			<div id="modal0" class="modal">																	<!-- modal# -->
				<span class="close0">&times;</span>															<!-- close# -->
				<img class="modal-content" id="img00" />															<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal0");														// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img0");															// img#
			var modalImg = document.getElementById("img00");													// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close0")[0];											// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>
			<figcaption>
			Current example output
			</figcaption>
		</figure>
	</div>

	<div class="frame-terminal">
		<figure class="right">
			<img id="img1" src="../images/screenshots/024_hardware/hardware_02_term.png" alt="Current example terminal output" />		<!-- img#, filename -->

			<!-- Modal for terminal shot -->
			<div id="modal1" class="modal">																				<!-- modal# -->
				<span class="close1">&times;</span>																		<!-- close# -->
				<img class="modal-content" id="img11" />																		<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal1");																	// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img1");																		// img#
			var modalImg = document.getElementById("img11");																// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close1")[0];														// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>

			<figcaption>
				Current example terminal output (click for enlarged view)
			</figcaption>
		</figure>
	</div>

	<div class="frame-footer">																								<!-- ------------- filename (below) --------- -->
		The code file for this example is available <a href="https://github.com/rontarrant/gtkd_demos/blob/master/024_hardware/hardware_02_full_monitor_report.d" target="_blank">here</a>.
	</div>
</div>
<!-- end of snippet for first (1st) occurrence of application and terminal screen shots on a single page -->

<p>To accomplish all this, we’re going to need a whole raft of imports, so as well as the ones we used from last time, we need to add these:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="n">gtk</span><span class="p">.</span><span class="n">Button</span><span class="p">;</span>

<span class="k">import</span> <span class="n">gdk</span><span class="p">.</span><span class="n">Device</span><span class="p">;</span>
<span class="k">import</span> <span class="n">gdk</span><span class="p">.</span><span class="n">Seat</span><span class="p">;</span>
<span class="k">import</span> <span class="n">gdk</span><span class="p">.</span><span class="n">Window</span><span class="p">;</span>
<span class="k">import</span> <span class="n">gdk</span><span class="p">.</span><span class="n">Rectangle</span><span class="p">;</span>
<span class="k">import</span> <span class="n">gdk</span><span class="p">.</span><span class="n">MonitorG</span><span class="p">;</span>
<span class="k">import</span> <span class="n">gdk</span><span class="p">.</span><span class="n">Screen</span><span class="p">;</span>
</code></pre></div></div>

<p>The reason we need the first import is obvious. The <code class="language-plaintext highlighter-rouge">Button</code> created will, when pressed, tell us which monitor the window is on. The rest are for gathering the information we want and we’ll go over them as we come to them.</p>

<h3 id="testrigwindow-class-preamble">TestRigWindow Class Preamble</h3>

<p>Here in the class preamble, we get set up to gather the info:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Screen</span> <span class="n">screen</span><span class="p">;</span>
<span class="n">ReportButton</span> <span class="n">reportButton</span><span class="p">;</span>
</code></pre></div></div>

<p>How they’re used:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">screen</code>: the default <code class="language-plaintext highlighter-rouge">Screen</code> used by our application,</li>
  <li><code class="language-plaintext highlighter-rouge">reportButton</code>: which, as stated above, will be used to tell us which monitor the <code class="language-plaintext highlighter-rouge">Window</code> is on at any given time. (If you’ve got a multi-monitor <code class="language-plaintext highlighter-rouge">Seat</code>, try moving the window from one to another and then clicking the button.)</li>
</ul>

<h3 id="the-constructor">The Constructor</h3>

<p>Here, we also have a bit more to do:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">this</span><span class="p">()</span>
<span class="p">{</span>
	<span class="k">super</span><span class="p">(</span><span class="n">title</span><span class="p">);</span>

	<span class="n">myDisplay</span> <span class="p">=</span> <span class="n">Display</span><span class="p">.</span><span class="n">getDefault</span><span class="p">();</span>
	<span class="n">monitorReport</span><span class="p">();</span>

	<span class="n">screen</span> <span class="p">=</span> <span class="n">Screen</span><span class="p">.</span><span class="n">getDefault</span><span class="p">();</span>
	<span class="n">writeln</span><span class="p">(</span><span class="s">"screen width: "</span><span class="p">,</span> <span class="n">screen</span><span class="p">.</span><span class="n">width</span><span class="p">(),</span> <span class="s">", height: "</span><span class="p">,</span> <span class="n">screen</span><span class="p">.</span><span class="n">height</span><span class="p">());</span>

	<span class="n">reportButton</span> <span class="p">=</span> <span class="k">new</span> <span class="n">ReportButton</span><span class="p">(</span><span class="n">myDisplay</span><span class="p">);</span>
	<span class="n">add</span><span class="p">(</span><span class="n">reportButton</span><span class="p">);</span>

	<span class="n">addOnDestroy</span><span class="p">(&amp;</span><span class="n">quitApp</span><span class="p">);</span>

	<span class="n">showAll</span><span class="p">();</span>

<span class="p">}</span> <span class="c1">// this()</span>
</code></pre></div></div>

<p>Besides calling <code class="language-plaintext highlighter-rouge">monitorReport()</code> to dump all the monitor information to the terminal, we also:</p>

<ul>
  <li>grab a pointer to the default <code class="language-plaintext highlighter-rouge">Screen</code> (from which all the other info is gleaned), and</li>
  <li>instantiate the <code class="language-plaintext highlighter-rouge">reportButton</code>, passing it a pointer to the default <code class="language-plaintext highlighter-rouge">Display</code>.</li>
</ul>

<p>We don’t <em>have</em> to pass this pointer. Because the <code class="language-plaintext highlighter-rouge">Display</code> is the default <code class="language-plaintext highlighter-rouge">Display</code>, it’s accessible from anywhere within our application. And that means we could just grab a pointer to the default <code class="language-plaintext highlighter-rouge">Display</code> from within the <code class="language-plaintext highlighter-rouge">reportButton</code> constructor instead. Either way works, but…</p>

<p>For the <code class="language-plaintext highlighter-rouge">TestRigWindow.monitorReport()</code> function to work, we need a pointer to the default <code class="language-plaintext highlighter-rouge">Display</code> there as well, so we might as well leave it there in the <code class="language-plaintext highlighter-rouge">TestRigWindow</code> constructor and pass it to the <code class="language-plaintext highlighter-rouge">ReportButton</code>. Then if, sometime down the road, we decide to change the way we’re handling the <code class="language-plaintext highlighter-rouge">Display</code> pointer, we only have to rework it in one place.</p>

<h3 id="the-monitorreport-function">The monitorReport() Function</h3>

<p>Here’s the function where it all happens:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="n">monitorReport</span><span class="p">()</span>
<span class="p">{</span>
	<span class="n">MonitorG</span> <span class="n">monitorG</span><span class="p">;</span>
	<span class="n">GdkRectangle</span> <span class="n">rectangle</span><span class="p">;</span>
	<span class="kt">int</span> <span class="n">numberOfMonitors</span> <span class="p">=</span> <span class="n">myDisplay</span><span class="p">.</span><span class="n">getNMonitors</span><span class="p">();</span>

	<span class="n">writeln</span><span class="p">(</span><span class="s">"Your set-up has "</span><span class="p">,</span> <span class="n">numberOfMonitors</span><span class="p">,</span> <span class="s">" monitors...\n\n"</span><span class="p">);</span>

	<span class="k">if</span><span class="p">(</span><span class="n">numberOfMonitors</span> <span class="p">&gt;</span> <span class="mi">1</span><span class="p">)</span>
	<span class="p">{</span>
		<span class="k">foreach</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="p">;</span> <span class="mf">0.</span><span class="p">.</span><span class="n">numberOfMonitors</span><span class="p">)</span>
		<span class="p">{</span>
			<span class="n">monitorG</span> <span class="p">=</span> <span class="n">myDisplay</span><span class="p">.</span><span class="n">getMonitor</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
			<span class="n">monitorG</span><span class="p">.</span><span class="n">getGeometry</span><span class="p">(</span><span class="n">rectangle</span><span class="p">);</span>

			<span class="n">writeln</span><span class="p">(</span><span class="s">"monitor #"</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
			<span class="n">writeln</span><span class="p">(</span><span class="s">"monitor position within the screen area - x = "</span><span class="p">,</span> <span class="n">rectangle</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="s">", y = "</span><span class="p">,</span> <span class="n">rectangle</span><span class="p">.</span><span class="n">y</span><span class="p">);</span>
			<span class="n">writeln</span><span class="p">(</span><span class="s">"monitor size: width = "</span><span class="p">,</span> <span class="n">rectangle</span><span class="p">.</span><span class="n">width</span><span class="p">,</span> <span class="s">", height = "</span><span class="p">,</span> <span class="n">rectangle</span><span class="p">.</span><span class="n">height</span><span class="p">);</span>
			<span class="n">writeln</span><span class="p">(</span><span class="s">"manufacturer: "</span><span class="p">,</span> <span class="n">monitorG</span><span class="p">.</span><span class="n">getManufacturer</span><span class="p">());</span>
			<span class="n">write</span><span class="p">(</span><span class="s">"monitor model: "</span><span class="p">,</span> <span class="n">monitorG</span><span class="p">.</span><span class="n">getModel</span><span class="p">());</span>

			<span class="k">if</span><span class="p">(</span><span class="n">monitorG</span><span class="p">.</span><span class="n">isPrimary</span><span class="p">())</span>
			<span class="p">{</span>
				<span class="n">write</span><span class="p">(</span><span class="s">" and it's your primary display."</span><span class="p">);</span>
			<span class="p">}</span>

			<span class="n">writeln</span><span class="p">();</span>
			<span class="n">writeln</span><span class="p">();</span>
		<span class="p">}</span>
	<span class="p">}</span>
	<span class="k">else</span>
	<span class="p">{</span>
		<span class="n">monitorG</span> <span class="p">=</span> <span class="n">myDisplay</span><span class="p">.</span><span class="n">getMonitor</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>

		<span class="n">writeln</span><span class="p">(</span><span class="s">"You have a single monitor"</span><span class="p">);</span>
		<span class="n">writeln</span><span class="p">(</span><span class="s">"monitor position within the display - x = "</span><span class="p">,</span> <span class="n">rectangle</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="s">", y = "</span><span class="p">,</span> <span class="n">rectangle</span><span class="p">.</span><span class="n">y</span><span class="p">);</span>
		<span class="n">writeln</span><span class="p">(</span><span class="s">"monitor size: width = "</span><span class="p">,</span> <span class="n">rectangle</span><span class="p">.</span><span class="n">width</span><span class="p">,</span> <span class="s">", height = "</span><span class="p">,</span> <span class="n">rectangle</span><span class="p">.</span><span class="n">height</span><span class="p">);</span>
		<span class="n">writeln</span><span class="p">(</span><span class="s">"manufacturer: "</span><span class="p">,</span> <span class="n">monitorG</span><span class="p">.</span><span class="n">getManufacturer</span><span class="p">());</span>
		<span class="n">write</span><span class="p">(</span><span class="s">"monitor model: "</span><span class="p">,</span> <span class="n">monitorG</span><span class="p">.</span><span class="n">getModel</span><span class="p">());</span>

		<span class="n">writeln</span><span class="p">(</span><span class="s">" and it's your only display."</span><span class="p">);</span>
	<span class="p">}</span>

<span class="p">}</span> <span class="c1">// monitorReport()</span>
</code></pre></div></div>

<p>This function starts off the same as it did in our previous example, by finding out how many monitors are available to the <code class="language-plaintext highlighter-rouge">Seat</code>, but from there, it goes into more detail, but before we go there, let’s look at the variables in the function preamble and what they’re used for:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">int numberOfMonitors</code>: self-explanitory,</li>
  <li><code class="language-plaintext highlighter-rouge">monitorG</code>: a temporary pointer for each monitor as we loop through the list of monitors in <code class="language-plaintext highlighter-rouge">monitorReport()</code>, and</li>
  <li><code class="language-plaintext highlighter-rouge">rectangle</code>: each monitor’s geometry (screen size and its placement in the <code class="language-plaintext highlighter-rouge">Screen</code>) as we loop through the list.</li>
</ul>

<p>Looking at the big picture here, we first determine if we’re on a single-monitor <code class="language-plaintext highlighter-rouge">Seat</code>. If not, we dig in and:</p>

<ul>
  <li>grab a pointer to the current monitor, assigning it to <code class="language-plaintext highlighter-rouge">monitorG</code>,</li>
  <li>find it’s geometry and store that info in a rectangle struct (<code class="language-plaintext highlighter-rouge">GdkRectangle</code> is defined in <a href="https://github.com/gtkd-developers/GtkD/blob/master/generated/gtkd/gdk/c/types.d">generated/gtkd/gdk/c/types.d</a> starting on line #3933),</li>
  <li>as each monitor is examined, we look to see if it’s the primary monitor for the <code class="language-plaintext highlighter-rouge">Seat</code>, and</li>
  <li>push all these various bits of information to the terminal.</li>
</ul>

<p>However, if there’s only one monitor, we don’t need to dig around so much. Instead, we just grab a pointer to the single monitor and dump all its info to the terminal.</p>

<h3 id="the-reportbutton">The ReportButton</h3>

<p>A lot of this is similar to any <code class="language-plaintext highlighter-rouge">Button</code> we’ve worked with before. It’s got a string to name the <code class="language-plaintext highlighter-rouge">Button</code>, we make a size request (for convenience, really; it’s just so the full <code class="language-plaintext highlighter-rouge">Window</code> title shows and there’s something to grab onto when moving the <code class="language-plaintext highlighter-rouge">Window</code> from monitor to monitor), add a callback, and connect that callback to a signal.</p>

<p>So, let’s go over what we haven’t done before…</p>

<h4 id="preamble">Preamble</h4>

<p>We declare:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Display</span> <span class="n">_myDisplay</span><span class="p">;</span>
<span class="n">MonitorG</span> <span class="n">_monitorG</span><span class="p">;</span>
</code></pre></div></div>

<p>Since we’ve gone over these already, let’s just move on to…</p>

<h4 id="constructor">Constructor</h4>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">this</span><span class="p">(</span><span class="n">Display</span> <span class="n">myDisplay</span><span class="p">)</span>
<span class="p">{</span>
	<span class="k">super</span><span class="p">(</span><span class="n">labelText</span><span class="p">);</span>
	<span class="n">setSizeRequest</span><span class="p">(</span><span class="mi">250</span><span class="p">,</span> <span class="mi">30</span><span class="p">);</span>

	<span class="n">addOnClicked</span><span class="p">(&amp;</span><span class="n">onClicked</span><span class="p">);</span>

	<span class="n">_myDisplay</span> <span class="p">=</span> <span class="n">myDisplay</span><span class="p">;</span>

<span class="p">}</span> <span class="c1">// this()</span>
</code></pre></div></div>

<p>We add a line to assign our local copy of the default <code class="language-plaintext highlighter-rouge">Display</code> pointer.</p>

<p>Things get interesting when we look at…</p>

<h4 id="callback">Callback</h4>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="n">onClicked</span><span class="p">(</span><span class="n">Button</span> <span class="n">b</span><span class="p">)</span>
<span class="p">{</span>
	<span class="n">MonitorG</span> <span class="n">monitorG4Window</span><span class="p">;</span>
	<span class="n">monitorG4Window</span> <span class="p">=</span> <span class="n">_myDisplay</span><span class="p">.</span><span class="n">getMonitorAtWindow</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">getWindow</span><span class="p">());</span>

	<span class="kt">int</span> <span class="n">numberOfMonitors</span> <span class="p">=</span> <span class="n">_myDisplay</span><span class="p">.</span><span class="n">getNMonitors</span><span class="p">();</span>

	<span class="k">foreach</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="p">;</span> <span class="mf">0.</span><span class="p">.</span><span class="n">numberOfMonitors</span><span class="p">)</span>
	<span class="p">{</span>
		<span class="n">_monitorG</span> <span class="p">=</span> <span class="n">_myDisplay</span><span class="p">.</span><span class="n">getMonitor</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>

		<span class="k">if</span><span class="p">(</span><span class="n">_monitorG</span> <span class="k">is</span> <span class="n">monitorG4Window</span><span class="p">)</span>
		<span class="p">{</span>
			<span class="n">writeln</span><span class="p">(</span><span class="s">"The current window is on monitor #"</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
		<span class="p">}</span>
	<span class="p">}</span>

<span class="p">}</span> <span class="c1">// onClicked()</span>
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">monitorG4Window</code>: reports whichever monitor the <code class="language-plaintext highlighter-rouge">Window</code> is on at the time the <code class="language-plaintext highlighter-rouge">Button</code> is pressed which is determined by a call to:</li>
  <li><code class="language-plaintext highlighter-rouge">_myDisplay.getMonitorAtWindow()</code> and passing in a pointer to our application’s <code class="language-plaintext highlighter-rouge">Window</code>,</li>
  <li>then we go through the process once again of finding out how many monitors there are and grabbing a pointer to each so we can compare that pointer to the <code class="language-plaintext highlighter-rouge">monitorG4Window</code> to see if they match, and</li>
  <li>write the result to the terminal.</li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>And that leaves just one more thing to say before closing:</p>

<p>Happy holidays!</p>

<p>See you next time for more hardware stuff when we look at keyboards, including an alternate way to grab key presses.</p>

<p>See you then.</p>

<div class="blog-nav">
	<div style="float: left;">
		<a href="./0094-hardware-i-monitors.html">Previous: Hardware I - Monitors</a>
	</div>
	<div style="float: right;">
		<a href="./0096-hardware-iii-keyboard-pointer.html">Next: Hardware IIII - Keyboard &amp; Pointer</a>
	</div>
</div>
<p>
	<h3></h3>
<div class="inpage-frame">
	<a href="https://github.com/sponsors/rontarrant">
		<BR>
		<BR>
		<B>Is this article useful? Educational? Entertaining, perhaps?</B>
		<BR>
		<figure class="left">
			<img src="../images/favorite_32.png" alt="Sponsorship heart" style="width: 32px; height: 32px;">
		</figure>
		You're free to accept or decline this invitation to become our newest sponsor.
	</a>
</div>
	<h4 class="comment-blurb"><B>Comments? Questions? Observations?</B></h4>
	<p>
		Did we miss a tidbit of information that would make this post even more informative? Let's talk about it in the comments.
	</p>
	<script src="https://utteranc.es/client.js"
		repo="rontarrant"
		issue-term="pathname"
		theme="github-light"
		crossorigin="anonymous"
		async>
	</script>
	<ul>
		<li> come on over to the <a href="https://forum.dlang.org/">D Language Forum</a> and look for one of the <i>gtkDcoding</i> announcement posts, </li>
		<li> drop by <a href="https://forum.gtkd.org/">the <i>GtkD Forum</i></a>,</li>
		<li> follow the link below to email me, or</li>
		<li> go to the	<a href="https://www.facebook.com">gtkDcoding Facebook page.</a></li>
	</ul>
</p>
<p> You can also subscribe <a href="/feed.xml">via RSS</a> so you won't miss anything. Thank you very much for dropping by.</p>
<p>&copy; Copyright 2025 Ron Tarrant </p>
</div>

	<a class="u-url" href="./0095-hardware-ii-full-monitor-report.html" hidden></a>
</article>

      </div>
    </main><footer class="site-footer h-card">
  <data class="u-url" href="/"></data>

  <div class="wrapper">

    <h2 class="footer-heading">gtkDcoding</h2>

    <div class="footer-col-wrapper">
      <div class="footer-col footer-col-1">
        <ul class="contact-list">
          <li class="p-name">Ron Tarrant</li><li><a class="u-email" href="mailto:gtkDcoding@gmail.com">gtkDcoding@gmail.com</a></li></ul>
      </div>

      <div class="footer-col footer-col-2"><ul class="social-media-list"><li><a href="https://github.com/rontarrant"><svg class="svg-icon"><use xlink:href="../assets/minima-social-icons.svg#github"></use></svg> <span class="username">rontarrant</span></a></li></ul>
</div>

      <div class="footer-col footer-col-3">
        <p>Simple examples of how to use GtkD to build GUI applications.</p>
      </div>
    </div>

  </div>

</footer>
</body>

</html>
